package com.my.service.Impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.my.entity.*;
import com.my.mapper.EmpExprMapper;
import com.my.mapper.EmpMapper;
import com.my.service.EmpLogService;
import com.my.service.EmpService;
import com.my.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
@Slf4j
public class EmpServiceImpl implements EmpService {

    @Autowired
    private EmpMapper empMapper;

    @Autowired
    private EmpExprMapper empExprMapper;

    @Autowired
    private EmpLogService empLogService;
    /**
     * 分页查询
     * @param page  页码 1/2/3
     * @param pageSize 每页记录数： 5,10
     * @return
     */
//    @Override
//    public PageBean page( Integer page, Integer pageSize) {
//        // 1.调用mapper获取总记录数
//        Long total = empMapper.count();
//
//        // 2.调用mapper获取分页列表数据
//        Integer start =  (page - 1) * pageSize; // 计算起始索引
//        List<Emp> empList = empMapper.page(start, pageSize);
//        // 3.封装pageBean对象并返回
//        return new PageBean(total,empList);
//    }
    /** PageHelper插件 实现查询
     @Override public PageBean page( Integer page, Integer pageSize) {
     // 1.设置分页参数
     PageHelper.startPage(page, pageSize);
     // 2.调用mapper的列表查询方法
     List<Emp> empList = empMapper.list();
     Page p = (Page) empList;  // 进行强转,Page继承了ArrayList

     // 分页只会对PageHelper.startPage()下面的第一条select进行处理
     //        PageHelper.startPage(page, pageSize);
     //        List<Emp> empList2 = empMapper.list();
     // 3.封装pageBean对象并返回
     return new PageBean(p.getTotal(),p.getResult());
     } */

    /**
     * 条件查询 多参传递
     * public PageBean page(String name, Integer gender, LocalDate begin, LocalDate end, Integer page, Integer pageSize) {
     * // 1.设置分页参数
     * PageHelper.startPage(page, pageSize);
     * // 2.调用mapper的列表查询方法
     * List<Emp> empList = empMapper.list(name, gender, begin, end);
     * Page p = (Page) empList;  // 进行强转,Page继承了ArrayList
     * <p>
     * return new PageBean(p.getTotal(),p.getResult());
     * }
     */

    public PageBean page(EmpQueryParam backage) {
        // 1.设置分页参数
        PageHelper.startPage(backage.getPage(), backage.getPageSize());
        // 2.调用mapper的列表查询方法
        List<Emp> empList = empMapper.list(backage);

        Page p = (Page) empList;  // 进行强转,Page继承了ArrayList

        return new PageBean(p.getTotal(), p.getResult());
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public void save(Emp emp) throws Exception {
        try {
            // 1.保存员工基本信息
            // 补充缺失字段
            emp.setPassword("123456");
            emp.setCreateTime(LocalDateTime.now());
            emp.setUpdateTime(LocalDateTime.now());
            // 调用mapper
            empMapper.insert(emp);

            Integer id = emp.getId();
            System.out.println("\n\n111");
            log.info("id={}", id);

            // 模拟异常
//        int a = 1/0;
            // 模拟非运行时异常
//            if(true){
//                throw new Exception("出错了！！");
//            }

            // 2. 调用mapper方法，保存员工的工作经历信息到EmpExpr表
            List<EmpExpr> exprList = emp.getExprList();
            // 2.1 关联员工id
            if (!CollectionUtils.isEmpty(exprList)) {
                exprList.forEach(e -> {
                    e.setEmpId(id);
                });
                // 2.2 调用mapper方法，批量保存工作经历数据
                empExprMapper.insertBatch(exprList);

            }
        } finally {
            // 无论员工添加成功与否都会添加日志
            EmpLog emplog = new EmpLog();
            emplog.setOperateTime(LocalDateTime.now());
            emplog.setInfo("添加的员工:" + emp);
            empLogService.insertLog(emplog);
        }
    }

    @Transactional(rollbackFor = Exception.class) // 开启事务，涉及多表操作时
    public void delete(List<Integer> ids) {
        // 1.删除员工数据emp
         empMapper.deleteBatch(ids);

        // 2.删除员工工作经历数据emp_expr
        empExprMapper.deleteBatch(ids);
    }

    @Override
    public Emp getById(Integer id) {
        // 方式一:
        // 1. 调用mapper的查询方法，获取员工的基本信息以及经历列表信息
        // return empMapper.getById(id);

        // 方式二:
        // 1. 查询员工基本信息，封装到Emp对象
        Emp emp = empMapper.getById2(id);
        // 2. 查询员工经历信息，封装到EmpExpr对象中
        List<EmpExpr> empExprList = empExprMapper.getByEmpId(id);
        emp.setExprList(empExprList);
        // 3. 返回员工Emp对象

        return emp;
    }

    /**
     * 修改员工信息
     *
     * @param emp
     * @return
     */
    @Override
    @Transactional //开启事务
    public void update(Emp emp) {
        // 1.修改员工基本信息
        emp.setUpdateTime(LocalDateTime.now());
        // 1.2 调用mapper
        empMapper.update(emp);

        // 2.修改员工经历
        // 先删后增 -- 简化代码
        empExprMapper.deleteById(emp.getId());
        List<EmpExpr> exprList = emp.getExprList(); // 可能为空

        // TODO

        // 关联员工id
        if (!CollectionUtils.isEmpty(exprList)) {
            exprList.forEach(expr -> {
                expr.setEmpId(emp.getId());
            });
            empExprMapper.insertBatch(exprList);
        }
    }

    /**
     * 登录
     * @return
     */
    @Override
    public LoginInfo login(Emp emp) {
        log.info("service:{}",emp);

        // 1.调用mapper查询员工
        Emp empDB = empMapper.login(emp);

        // 2.判断用户名和密码是否为正确 返回结果是否为空
        if(empDB != null){

            // 完善登录逻辑，登录完成生成令牌
            Map<String, Object> claims = new HashMap<>();
            claims.put("Id", empDB.getId());
            claims.put("username", empDB.getUsername());

            // 调用JWT工具类，生成令牌
            String jwt = JwtUtils.generateJwt(claims);
            log.info("jwt:{}",jwt);
            // 3.如果查到数据，构造loginInfo对象，并返回
            return new LoginInfo(empDB.getId(),empDB.getUsername(),empDB.getName(),jwt);
        }
        return null;
    }
}
